package h0801;

import java.util.*;

/**
 * @author 不知名帅哥
 * @version 1.0
 * @description 执行任务赚取积分
 * @date 2024/8/1 11:18
 */
public class EarnPointsByExecuteTasks {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); //n个任务
        int tmp = sc.nextInt(); //总时间
        int[][] arr = new int[n][2];
        for (int i = 0; i < arr.length; i++) {
            arr[i][0] = sc.nextInt(); //时刻
            arr[i][1] = sc.nextInt(); //积分
        }
        System.out.println(computePoints(arr, tmp));
    }

    private static int computePoints(int[][] tasks, int T) {
        //按照任务最晚处理时间SLA进行排序
        Arrays.sort(tasks, Comparator.comparingInt(o -> o[0]));

        //最大堆优先队列，按照积分从高到低排序
        PriorityQueue<Integer> pq = new PriorityQueue<>((o1, o2) -> o2 - o1);

        int totalPoints = 0;
        int timeUsed = 0;
        for (int[] task : tasks) {
            //分为用完时间和没用完时间两种情况
            int sla = task[0]; //截止时间
            int points = task[1];
            if (timeUsed < T && sla > timeUsed) { //还没有用完 TODO 注意这里必须加上sla<timeUsed，因为必须截至时刻大于已经使用了的时刻才行，每个时刻只能执行一个任务。
                pq.offer(points); //加入最大堆
                totalPoints += points;
                timeUsed++;
            } else if (!pq.isEmpty() && pq.peek() < points) {
                //TODO 当前任务的积分大于堆顶，
                // 就用当前任务积分替换堆顶，并更新总的积分去掉旧的加上新的。
                totalPoints += points - pq.poll();
                pq.offer(points);
            }
        }
        return totalPoints;
    }
}
